Utility functions
dataset_name != all_files[file_id]
[1] TRUE
Path variables
# dataset base path
base_path = "/Users/lana/Desktop/prgm/CSL/FLR_contest/data/"
Bird data. Selected: 0, 1, 4, 7, 13
dataset_dir = paste(base_path, "real_life/Annotated20GPS20tracking20data/data/", sep = "")
output_dir = "real_ready/0/"
offset = 5000
steps = 2000
header = TRUE
column_names = c("latitude", "longitude")
total_cuts = 20
real_data = TRUE
cut_data(dataset_dir, output_dir, offset, steps, header, column_names, total_cuts, real_data, NULL, NULL)
Read ants data Selected: 0,1,2,3,4
dataset_dir = paste(base_path, "real_life/Ant20exploration20trajectories/data/", sep = "")
output_dir = "real_ready/1/"
offset = 10000
steps = 2000
header = FALSE
column_names = c("V2", "V3")
total_cuts = 5
real_data = TRUE
cut_data(dataset_dir, output_dir, offset, steps, header, column_names, total_cuts, real_data, NULL, NULL)
Read shark data Select 0-4
dataset_dir = paste(base_path, "real_life/sharks/data/", sep = "")
output_dir = "real_ready/2/"
offset = 10000
steps = 2000
header = TRUE
column_names = c("lat", "long")
total_cuts = 5
real_data = TRUE
cut_data(dataset_dir, output_dir, offset, steps, header, column_names, total_cuts, real_data, NULL, NULL)
# dataset_name = paste(dataset_dir, "BT_Palmyra_telemetry_hourly_through2015.csv", sep = "")
# df = read.csv(dataset_name, check.names = FALSE, header = header, stringsAsFactors = FALSE)
#
# plot(df$lat[1:50], df$long[1:50], type = "l")
Read spiders data Data is divided in small trials…. Selected 0, 1, 6, 7, 14
dataset_dir = paste(base_path, "real_life/spiders/data/", sep = "")
output_dir = "real_ready/3/"
offset = 50000
steps = 2000
header = TRUE
column_names = c("x location mm", "y location mm")
total_cuts = 15
real_data = TRUE
cut_data(dataset_dir, output_dir, offset, steps, header, column_names, total_cuts, real_data, NULL, NULL)
Read jaguar data Select 0, 2, 3, 5, 6
dataset_dir = paste(base_path, "real_life/jaguars/data/", sep = "")
output_dir = "real_ready/4/"
offset = 5000
steps = 2000
header = TRUE
column_names = c("location.long", "location.lat")
total_cuts = 10
real_data = TRUE
cut_data(dataset_dir, output_dir, offset, steps, header, column_names, total_cuts, real_data, NULL, NULL)
Read boids data
dataset_dir = paste(base_path, "fake_life/boids", sep = "")
output_dir = "fake_ready/0/"
offset = 0
steps = 2000
header = FALSE
column_names = c("V2", "V3")
total_cuts = 5
real_data = FALSE
diffmax = c(0.4,0.4) #
field_size = c(1,1)
cut_data(dataset_dir, output_dir, offset, steps, header, column_names, total_cuts, real_data, diffmax, field_size)
Clean artificial chemistry data Data is already perfectly clean
dataset_dir = paste(base_path, "fake_life/artificial_chemistry/", sep = "")
output_dir = "fake_ready/1/"
offset = 0
steps = 2000
header = FALSE
column_names = c("V2", "V3")
total_cuts = 5
real_data = TRUE # no cleaning needed
diffmax = NULL
field_size = NULL
cut_data(dataset_dir, output_dir, offset, steps, header, column_names, total_cuts, real_data, diffmax, field_size)
Read Olaf data 1
dataset_dir = paste(base_path, "fake_life/olaf_1/", sep = "")
output_dir = "fake_ready/2/"
offset = 0
steps = 2000
header = TRUE
column_names = c("x", "y")
total_cuts = 5
diffmax = c(6,6)
field_size = c(8,8)
cut_data(dataset_dir, output_dir, offset, steps, header, column_names, total_cuts, FALSE, diffmax, field_size)
Read Olaf data 2 Data is clean
dataset_dir = paste(base_path, "fake_life/olaf_2/", sep = "")
output_dir = "fake_ready/3/"
offset = 0
steps = 2000
header = TRUE
column_names = c("x", "y")
total_cuts = 5
real_data = TRUE # no cleaning needed
diffmax = NULL
field_size = NULL
cut_data(dataset_dir, output_dir, offset, steps, header, column_names, total_cuts, real_data, diffmax, field_size)
Read robot arm data
dataset_dir = paste(base_path, "fake_life/robot_arm/", sep = "")
output_dir = "fake_ready/4/"
offset = 0
steps = 2000
header = TRUE
column_names = c("x", "y")
total_cuts = 5
real_data = TRUE # no cleaning needed
diffmax = NULL
field_size = NULL
cut_data(dataset_dir, output_dir, offset, steps, header, column_names, total_cuts, real_data, diffmax, field_size)
Finally, plot all selected data
dataset_dir = paste(base_path, "real_ready/", sep = "")
all_files = list.files(path = dataset_dir, full.names = TRUE, recursive = TRUE)
for(dataset_name in all_files){
df = read.csv(dataset_name, check.names = FALSE, header = header, stringsAsFactors = FALSE)
plot(x = df$x, y = df$y, type = "l", main = dataset_name)
}

























dataset_dir = paste(base_path, "fake_ready/", sep = "")
all_files = list.files(path = dataset_dir, full.names = TRUE, recursive = TRUE)
for(dataset_name in all_files){
df = read.csv(dataset_name, check.names = FALSE, header = header, stringsAsFactors = FALSE)
plot(x = df$x, y = df$y, type = "l", main = dataset_name)
}

























LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6IGRlZmF1bHQKICBodG1sX25vdGVib29rOiBkZWZhdWx0Ci0tLQoKVXRpbGl0eSBmdW5jdGlvbnMKCmBgYHtyfQojIHNlbGVjdCBhbmQgcmVuYW1lIGNvbHVtbnMKIyBkZXRlY3QgYm91bmRhcnkgY29uZGl0aW9ucwojIGRpZmZtYXg6IG1heGltdW0gdG9sZXJhdGVkIGRpZmZlcmVuY2UgYmV0d2VlbiB0IGFuZCB0KzEgdG8gZGV0ZWN0IGJvcmRlciBjcm9zc2luZywgZWcgYyh2ZWxvY2l0eV94bWF4LCB2ZWxvY2l0eV95bWF4KQojIGZpZWxkX3NpemU6IHRvIG9mZnNlZCBib3VuZGFyeSBjcm9zc2luZwpzYXZlX2NsZWFuX2RhdGEgPC0gZnVuY3Rpb24oZGYsIHRhcmdldF9jb2x1bW5zLCBvdXRwdXRfcGF0aCwgcmVhbF9kYXRhLCBkaWZmbWF4LCBmaWVsZF9zaXplKSB7CiAgCiAgIyBhZGQgcm93IGlkIGFzICJ0aW1lIgogIGNsZWFuX2RhdGEgPSBkYXRhLmZyYW1lKGMoMDoobGVuZ3RoKGRmW1t0YXJnZXRfY29sdW1uc1sxXV1dKS0xKSksIGRmW1t0YXJnZXRfY29sdW1uc1sxXV1dLCBkZltbdGFyZ2V0X2NvbHVtbnNbMl1dXSkKICBjb2xuYW1lcyhjbGVhbl9kYXRhKSA9IGMoInQiLCAieCIsICJ5IikKICBjbGVhbl9kYXRhWywgY29sbmFtZXMoY2xlYW5fZGF0YSldIDwtIGxhcHBseShjb2xuYW1lcyhjbGVhbl9kYXRhKSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyhjbGVhbl9kYXRhW1t4XV0pKQogIHByaW50KGxlbmd0aChjbGVhbl9kYXRhJHQpKQogIAogICMgZGVhbCB3aXRoIGJvdW5kYXJ5IGNvbmRpdGlvbnMKICBpZighcmVhbF9kYXRhKXsKICAgIG5yb3dzID0gbGVuZ3RoKGNsZWFuX2RhdGEkdCkKICAgICNib3VuZGFyeSBjb25kaXRpb25zCiAgICBkaWZmID0gY2xlYW5fZGF0YQogICAgZGlmZiRkeCA9IGRpZmYkeCAtIGMoMCwgZGlmZiR4WzE6KG5yb3dzLTEpXSkKICAgIGluZGV4IDwtIGRpZmYkZHggPiBkaWZmbWF4WzFdCiAgICAjIG9mZnNldCBhbGwgZGF0YSBmcm9tIHRoZXJlCiAgICB0aW1lX2luZGljZXMgPSBjbGVhbl9kYXRhJHRbaW5kZXhdCiAgICBmb3IgKCB0aW1lIGluIHRpbWVfaW5kaWNlcykgewogICAgICBjbGVhbl9kYXRhJHhbKHRpbWUrMSk6bnJvd3NdID0gY2xlYW5fZGF0YSR4Wyh0aW1lKzEpOm5yb3dzXSAtIGZpZWxkX3NpemVbMV0KICAgIH0KICAgIAogICAgaW5kZXggPSBkaWZmJGR4IDwgKC1kaWZmbWF4WzFdKQogICAgdGltZV9pbmRpY2VzID0gY2xlYW5fZGF0YSR0W2luZGV4XQogICAgZm9yICggdGltZSBpbiB0aW1lX2luZGljZXMpIHsKICAgICAgY2xlYW5fZGF0YSR4Wyh0aW1lKzEpOm5yb3dzXSA9IGNsZWFuX2RhdGEkeFsodGltZSsxKTpucm93c10gKyBmaWVsZF9zaXplWzFdCiAgICB9CgogICAgZGlmZiRkeSA9IGRpZmYkeSAtIGMoMCwgZGlmZiR5WzE6KG5yb3dzLTEpXSkKICAgIGluZGV4IDwtIGRpZmYkZHkgPiBkaWZmbWF4WzJdCiAgICB0aW1lX2luZGljZXMgPSBjbGVhbl9kYXRhJHRbaW5kZXhdCiAgICBmb3IgKCB0aW1lIGluIHRpbWVfaW5kaWNlcykgewogICAgICBjbGVhbl9kYXRhJHlbKHRpbWUrMSk6bnJvd3NdID0gY2xlYW5fZGF0YSR5Wyh0aW1lKzEpOm5yb3dzXSAtIGZpZWxkX3NpemVbMl0KICAgIH0KICAgIAogICAgaW5kZXggPSBkaWZmJGR5IDwgKC1kaWZmbWF4WzJdKQogICAgdGltZV9pbmRpY2VzID0gY2xlYW5fZGF0YSR0W2luZGV4XQogICAgZm9yICggdGltZSBpbiB0aW1lX2luZGljZXMpIHsKICAgICAgY2xlYW5fZGF0YSR5Wyh0aW1lKzEpOm5yb3dzXSA9IGNsZWFuX2RhdGEkeVsodGltZSsxKTpucm93c10gKyBmaWVsZF9zaXplWzJdCiAgICB9CiAgfQogIAogICMgcGxvdCh4ID0gY2xlYW5fZGF0YSR4LCB5ID0gY2xlYW5fZGF0YSR5LAogICMgICAgICB0eXBlID0gImwiLCBtYWluID0gb3V0cHV0X3BhdGgpCiAgCiAgIyBmaW5hbGx5LCBub3JtYWxpemUgdGhlIGRhdGEgYW5kIGdpdmUgcHJlY2lzaW9uIHRvIDQgZGVjaW1hbHMKICBwcmVjaXNpb24gPSA0CiAgZmFjdG9yID0gbWF4KGNsZWFuX2RhdGEkeCkgLSBtaW4oY2xlYW5fZGF0YSR4KQogIG9mZiA9IG1pbihjbGVhbl9kYXRhJHgpCiAgY2xlYW5fZGF0YSR4ID0gcm91bmQoIChjbGVhbl9kYXRhJHgtb2ZmKS9mYWN0b3IsIGRpZ2l0cyA9IHByZWNpc2lvbikKICBmYWN0b3IgPSBtYXgoY2xlYW5fZGF0YSR5KSAtIG1pbihjbGVhbl9kYXRhJHkpCiAgb2ZmID0gbWluKGNsZWFuX2RhdGEkeSkKICBjbGVhbl9kYXRhJHkgPSByb3VuZCggKGNsZWFuX2RhdGEkeSAtIG9mZikvZmFjdG9yLCBkaWdpdHMgPSBwcmVjaXNpb24pCgogIHBsb3QoeCA9IGNsZWFuX2RhdGEkeCwgeSA9IGNsZWFuX2RhdGEkeSwKICAgICAgIHR5cGUgPSAibCIsIG1haW4gPSBvdXRwdXRfcGF0aCkKICAKICB3cml0ZS5jc3YoY2xlYW5fZGF0YSwgcGFzdGUoYmFzZV9wYXRoLCBvdXRwdXRfcGF0aCwgc2VwID0gIiIpLCByb3cubmFtZXM9RkFMU0UpIAogIHByaW50KG91dHB1dF9wYXRoKQp9CgojIGN1dCBmaWxlcyBpbiBhIGRpcmVjdG9yeSBpbnRvIHNtYWxsZXIgYml0cwojIG9mZnNldDogc3RhcnRpbmcgcG9pbnQsIGV2ZXJ5dGhpbmcgYmVmb3JlIHRoaXMgc3RlcCB3aWxsIGJlIGlnbm9yZWQKIyBkYXRhc2V0X2RpcjogcGF0aCB3aGVyZSB0aGUgZmlsZXMgYXJlIHN0b3JlZAojIG91dHB1dF9kaXI6IHBhdGggd2hlcmUgdGhlIG91dHB1dCB3aWxsIGJlIHN0b3JlZAojIHN0ZXBzOiBzaXplIG9mIGVhY2ggb3V0cHV0IGZpbGUKIyBoZWFkZXI6IGRvIHRoZSBkYXRhIGZpbGVzIGhhdmUgaGVhZGVycyBvciBub3QKIyBjb2x1bW5fbmFtZXM6IGNvbHVtbnMgdG8gYmUgc2VsZWN0ZWQKIyB0b3RhbF9jdXRzOiBudW1iZXIgb2Ygb3V0cHV0IGZpbGVzCiMgcmVhbF9kYXRhOiB0cnVlIGlmIHJlYWwgZGF0YSwgZmFsc2UgaWYgZmFrZQpjdXRfZGF0YSA9IGZ1bmN0aW9uKGRhdGFzZXRfZGlyLCBvdXRwdXRfZGlyLCBvZmZzZXQsIHN0ZXBzLCBoZWFkZXIsIHRhcmdldF9jb2x1bW5zLAogICAgICAgICAgICAgICAgICAgIHRvdGFsX2N1dHMsIHJlYWxfZGF0YSwgZGlmZm1heCwgZmllbGRfc2l6ZSl7CiAgZGlyLmNyZWF0ZShwYXN0ZShiYXNlX3BhdGgsIG91dHB1dF9kaXIsIHNlcCA9ICIiKSwgc2hvd1dhcm5pbmdzID0gRkFMU0UpCgogIGFsbF9maWxlcyA9IGxpc3QuZmlsZXMocGF0aCA9IGRhdGFzZXRfZGlyLCBmdWxsLm5hbWVzID0gVFJVRSwgcmVjdXJzaXZlID0gRkFMU0UpCiAgIyByZWFkIGZpbGVzIGluIG9yZGVyLCBwbG90IGFuZCBzYXZlIGJ5IDIwMDAgdGltZSBzdGVwcyBpbmNyZW1lbnRzCiAgZmlsZV9pZCA9IDEKICBydW4gPSAwCgogIGRhdGFzZXRfbmFtZSA9ICIiCiAgZm9yKGkgaW4gYygwOih0b3RhbF9jdXRzLTEpKSl7CiAgICBwcmludChpKQogICAgaWYoZGF0YXNldF9uYW1lICE9IGFsbF9maWxlc1tmaWxlX2lkXSl7CiAgICAgIGRhdGFzZXRfbmFtZSA9IGFsbF9maWxlc1tmaWxlX2lkXQogICAgICAKICAgICAgcHJpbnQoZGF0YXNldF9uYW1lKQogICAgICBkZiA9IHJlYWQuY3N2KGRhdGFzZXRfbmFtZSwgY2hlY2submFtZXMgPSBGQUxTRSwgaGVhZGVyID0gaGVhZGVyLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCiAgICB9CiAgICBzdGFydCA9IG9mZnNldCArIHJ1bipzdGVwcyArIDEKICAgIHN1Yl9kZiA9IGRmW3N0YXJ0OihzdGFydCArIHN0ZXBzIC0xKSxdCiAgICBvdXRwdXRfcGF0aCA9IHBhc3RlKG91dHB1dF9kaXIsIGkgLCAiLmNzdiIsIHNlcCA9ICIiKQogICAgcHJpbnQob3V0cHV0X3BhdGgpCiAgICBzYXZlX2NsZWFuX2RhdGEoc3ViX2RmLCB0YXJnZXRfY29sdW1ucywgb3V0cHV0X3BhdGgsIHJlYWxfZGF0YSwgZGlmZm1heCwgZmllbGRfc2l6ZSkKICAgCiAgICBmaWxlX2lkID0gZmlsZV9pZCArIDEKICAgIGlmIChmaWxlX2lkID49IGxlbmd0aChhbGxfZmlsZXMpICl7CiAgICAgIGZpbGVfaWQgPSAxCiAgICAgIHJ1biA9IHJ1biArIDEKICAgIH0KICB9Cn0KCmBgYAoKClBhdGggdmFyaWFibGVzCgpgYGB7cn0KCiMgZGF0YXNldCBiYXNlIHBhdGgKYmFzZV9wYXRoID0gIi9Vc2Vycy9sYW5hL0Rlc2t0b3AvcHJnbS9DU0wvRkxSX2NvbnRlc3QvZGF0YS8iCgpgYGAKCkJpcmQgZGF0YS4KU2VsZWN0ZWQ6IDAsIDEsIDQsIDcsIDEzCmBgYHtyfQpkYXRhc2V0X2RpciA9IHBhc3RlKGJhc2VfcGF0aCwgInJlYWxfbGlmZS9Bbm5vdGF0ZWQyMEdQUzIwdHJhY2tpbmcyMGRhdGEvZGF0YS8iLCBzZXAgPSAiIikKb3V0cHV0X2RpciA9ICJyZWFsX3JlYWR5LzAvIgpvZmZzZXQgPSA1MDAwCnN0ZXBzID0gMjAwMApoZWFkZXIgPSBUUlVFCmNvbHVtbl9uYW1lcyA9IGMoImxhdGl0dWRlIiwgImxvbmdpdHVkZSIpCnRvdGFsX2N1dHMgPSAyMApyZWFsX2RhdGEgPSBUUlVFCmN1dF9kYXRhKGRhdGFzZXRfZGlyLCBvdXRwdXRfZGlyLCBvZmZzZXQsIHN0ZXBzLCBoZWFkZXIsIGNvbHVtbl9uYW1lcywgdG90YWxfY3V0cywgcmVhbF9kYXRhLCBOVUxMLCBOVUxMKQoKYGBgCgoKUmVhZCBhbnRzIGRhdGEKU2VsZWN0ZWQ6IDAsMSwyLDMsNAoKYGBge3J9CmRhdGFzZXRfZGlyID0gcGFzdGUoYmFzZV9wYXRoLCAicmVhbF9saWZlL0FudDIwZXhwbG9yYXRpb24yMHRyYWplY3Rvcmllcy9kYXRhLyIsIHNlcCA9ICIiKQoKb3V0cHV0X2RpciA9ICJyZWFsX3JlYWR5LzEvIgpvZmZzZXQgPSAxMDAwMApzdGVwcyA9IDIwMDAKaGVhZGVyID0gRkFMU0UKY29sdW1uX25hbWVzID0gYygiVjIiLCAiVjMiKQp0b3RhbF9jdXRzID0gNQpyZWFsX2RhdGEgPSBUUlVFCmN1dF9kYXRhKGRhdGFzZXRfZGlyLCBvdXRwdXRfZGlyLCBvZmZzZXQsIHN0ZXBzLCBoZWFkZXIsIGNvbHVtbl9uYW1lcywgdG90YWxfY3V0cywgcmVhbF9kYXRhLCBOVUxMLCBOVUxMKQoKYGBgCgpSZWFkIHNoYXJrIGRhdGEKU2VsZWN0IDAtNAoKYGBge3J9CmRhdGFzZXRfZGlyID0gcGFzdGUoYmFzZV9wYXRoLCAicmVhbF9saWZlL3NoYXJrcy9kYXRhLyIsIHNlcCA9ICIiKQoKb3V0cHV0X2RpciA9ICJyZWFsX3JlYWR5LzIvIgpvZmZzZXQgPSAxMDAwMApzdGVwcyA9IDIwMDAKaGVhZGVyID0gVFJVRQpjb2x1bW5fbmFtZXMgPSBjKCJsYXQiLCAibG9uZyIpCnRvdGFsX2N1dHMgPSA1CnJlYWxfZGF0YSA9IFRSVUUKY3V0X2RhdGEoZGF0YXNldF9kaXIsIG91dHB1dF9kaXIsIG9mZnNldCwgc3RlcHMsIGhlYWRlciwgY29sdW1uX25hbWVzLCB0b3RhbF9jdXRzLCByZWFsX2RhdGEsIE5VTEwsIE5VTEwpCiMgZGF0YXNldF9uYW1lICA9IHBhc3RlKGRhdGFzZXRfZGlyLCAiQlRfUGFsbXlyYV90ZWxlbWV0cnlfaG91cmx5X3Rocm91Z2gyMDE1LmNzdiIsIHNlcCA9ICIiKQojIGRmID0gcmVhZC5jc3YoZGF0YXNldF9uYW1lLCBjaGVjay5uYW1lcyA9IEZBTFNFLCBoZWFkZXIgPSBoZWFkZXIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKIyAKIyBwbG90KGRmJGxhdFsxOjUwXSwgZGYkbG9uZ1sxOjUwXSwgdHlwZSA9ICJsIikKYGBgCgpSZWFkIHNwaWRlcnMgZGF0YQpEYXRhIGlzIGRpdmlkZWQgaW4gc21hbGwgdHJpYWxzLi4uLgpTZWxlY3RlZCAwLCAxLCA2LCA3LCAxNApgYGB7cn0KZGF0YXNldF9kaXIgPSBwYXN0ZShiYXNlX3BhdGgsICJyZWFsX2xpZmUvc3BpZGVycy9kYXRhLyIsIHNlcCA9ICIiKQoKb3V0cHV0X2RpciA9ICJyZWFsX3JlYWR5LzMvIgpvZmZzZXQgPSA1MDAwMApzdGVwcyA9IDIwMDAKaGVhZGVyID0gVFJVRQpjb2x1bW5fbmFtZXMgPSBjKCJ4IGxvY2F0aW9uIG1tIiwgInkgbG9jYXRpb24gbW0iKQp0b3RhbF9jdXRzID0gMTUKcmVhbF9kYXRhID0gVFJVRQpjdXRfZGF0YShkYXRhc2V0X2Rpciwgb3V0cHV0X2Rpciwgb2Zmc2V0LCBzdGVwcywgaGVhZGVyLCBjb2x1bW5fbmFtZXMsIHRvdGFsX2N1dHMsIHJlYWxfZGF0YSwgTlVMTCwgTlVMTCkKCmBgYAoKUmVhZCBqYWd1YXIgZGF0YQpTZWxlY3QgMCwgMiwgMywgNSwgNgpgYGB7cn0KZGF0YXNldF9kaXIgPSBwYXN0ZShiYXNlX3BhdGgsICJyZWFsX2xpZmUvamFndWFycy9kYXRhLyIsIHNlcCA9ICIiKQoKb3V0cHV0X2RpciA9ICJyZWFsX3JlYWR5LzQvIgpvZmZzZXQgPSA1MDAwCnN0ZXBzID0gMjAwMApoZWFkZXIgPSBUUlVFCmNvbHVtbl9uYW1lcyA9IGMoImxvY2F0aW9uLmxvbmciLCAibG9jYXRpb24ubGF0IikKdG90YWxfY3V0cyA9IDEwCnJlYWxfZGF0YSA9IFRSVUUKY3V0X2RhdGEoZGF0YXNldF9kaXIsIG91dHB1dF9kaXIsIG9mZnNldCwgc3RlcHMsIGhlYWRlciwgY29sdW1uX25hbWVzLCB0b3RhbF9jdXRzLCByZWFsX2RhdGEsIE5VTEwsIE5VTEwpCgpgYGAKCgpSZWFkIGJvaWRzIGRhdGEKCmBgYHtyfQpkYXRhc2V0X2RpciA9IHBhc3RlKGJhc2VfcGF0aCwgImZha2VfbGlmZS9ib2lkcyIsIHNlcCA9ICIiKQpvdXRwdXRfZGlyID0gImZha2VfcmVhZHkvMC8iCm9mZnNldCA9IDAKc3RlcHMgPSAyMDAwCmhlYWRlciA9IEZBTFNFCmNvbHVtbl9uYW1lcyA9IGMoIlYyIiwgIlYzIikKdG90YWxfY3V0cyA9IDUKcmVhbF9kYXRhID0gRkFMU0UKZGlmZm1heCA9IGMoMC40LDAuNCkgIwpmaWVsZF9zaXplID0gYygxLDEpCmN1dF9kYXRhKGRhdGFzZXRfZGlyLCBvdXRwdXRfZGlyLCBvZmZzZXQsIHN0ZXBzLCBoZWFkZXIsIGNvbHVtbl9uYW1lcywgdG90YWxfY3V0cywgcmVhbF9kYXRhLCBkaWZmbWF4LCBmaWVsZF9zaXplKQoKYGBgCgoKQ2xlYW4gYXJ0aWZpY2lhbCBjaGVtaXN0cnkgZGF0YQpEYXRhIGlzIGFscmVhZHkgcGVyZmVjdGx5IGNsZWFuCgpgYGB7cn0KCmRhdGFzZXRfZGlyID0gcGFzdGUoYmFzZV9wYXRoLCAiZmFrZV9saWZlL2FydGlmaWNpYWxfY2hlbWlzdHJ5LyIsIHNlcCA9ICIiKQpvdXRwdXRfZGlyID0gImZha2VfcmVhZHkvMS8iCm9mZnNldCA9IDAKc3RlcHMgPSAyMDAwCmhlYWRlciA9IEZBTFNFCmNvbHVtbl9uYW1lcyA9IGMoIlYyIiwgIlYzIikKdG90YWxfY3V0cyA9IDUKcmVhbF9kYXRhID0gVFJVRSAjIG5vIGNsZWFuaW5nIG5lZWRlZApkaWZmbWF4ID0gTlVMTApmaWVsZF9zaXplID0gTlVMTApjdXRfZGF0YShkYXRhc2V0X2Rpciwgb3V0cHV0X2Rpciwgb2Zmc2V0LCBzdGVwcywgaGVhZGVyLCBjb2x1bW5fbmFtZXMsIHRvdGFsX2N1dHMsIHJlYWxfZGF0YSwgZGlmZm1heCwgZmllbGRfc2l6ZSkKYGBgCgpSZWFkIE9sYWYgZGF0YSAxCgpgYGB7cn0KZGF0YXNldF9kaXIgPSBwYXN0ZShiYXNlX3BhdGgsICJmYWtlX2xpZmUvb2xhZl8xLyIsIHNlcCA9ICIiKQpvdXRwdXRfZGlyID0gImZha2VfcmVhZHkvMi8iCm9mZnNldCA9IDAKc3RlcHMgPSAyMDAwCmhlYWRlciA9IFRSVUUKY29sdW1uX25hbWVzID0gYygieCIsICJ5IikKdG90YWxfY3V0cyA9IDUKZGlmZm1heCA9IGMoNiw2KQpmaWVsZF9zaXplID0gYyg4LDgpCmN1dF9kYXRhKGRhdGFzZXRfZGlyLCBvdXRwdXRfZGlyLCBvZmZzZXQsIHN0ZXBzLCBoZWFkZXIsIGNvbHVtbl9uYW1lcywgdG90YWxfY3V0cywgRkFMU0UsIGRpZmZtYXgsIGZpZWxkX3NpemUpCgpgYGAKCgpSZWFkIE9sYWYgZGF0YSAyCkRhdGEgaXMgY2xlYW4KCmBgYHtyfQpkYXRhc2V0X2RpciA9IHBhc3RlKGJhc2VfcGF0aCwgImZha2VfbGlmZS9vbGFmXzIvIiwgc2VwID0gIiIpCm91dHB1dF9kaXIgPSAiZmFrZV9yZWFkeS8zLyIKb2Zmc2V0ID0gMApzdGVwcyA9IDIwMDAKaGVhZGVyID0gVFJVRQpjb2x1bW5fbmFtZXMgPSBjKCJ4IiwgInkiKQp0b3RhbF9jdXRzID0gNQpyZWFsX2RhdGEgPSBUUlVFICMgbm8gY2xlYW5pbmcgbmVlZGVkCmRpZmZtYXggPSBOVUxMCmZpZWxkX3NpemUgPSBOVUxMCmN1dF9kYXRhKGRhdGFzZXRfZGlyLCBvdXRwdXRfZGlyLCBvZmZzZXQsIHN0ZXBzLCBoZWFkZXIsIGNvbHVtbl9uYW1lcywgdG90YWxfY3V0cywgcmVhbF9kYXRhLCBkaWZmbWF4LCBmaWVsZF9zaXplKQoKYGBgCgpSZWFkIHJvYm90IGFybSBkYXRhCgpgYGB7cn0KCmRhdGFzZXRfZGlyID0gcGFzdGUoYmFzZV9wYXRoLCAiZmFrZV9saWZlL3JvYm90X2FybS8iLCBzZXAgPSAiIikKb3V0cHV0X2RpciA9ICJmYWtlX3JlYWR5LzQvIgpvZmZzZXQgPSAwCnN0ZXBzID0gMjAwMApoZWFkZXIgPSBUUlVFCmNvbHVtbl9uYW1lcyA9IGMoIngiLCAieSIpCnRvdGFsX2N1dHMgPSA1CnJlYWxfZGF0YSA9IFRSVUUgIyBubyBjbGVhbmluZyBuZWVkZWQKZGlmZm1heCA9IE5VTEwKZmllbGRfc2l6ZSA9IE5VTEwKY3V0X2RhdGEoZGF0YXNldF9kaXIsIG91dHB1dF9kaXIsIG9mZnNldCwgc3RlcHMsIGhlYWRlciwgY29sdW1uX25hbWVzLCB0b3RhbF9jdXRzLCByZWFsX2RhdGEsIGRpZmZtYXgsIGZpZWxkX3NpemUpCgpgYGAKCgpGaW5hbGx5LCBwbG90IGFsbCBzZWxlY3RlZCBkYXRhCgpgYGB7cn0KCmRhdGFzZXRfZGlyID0gcGFzdGUoYmFzZV9wYXRoLCAicmVhbF9yZWFkeS8iLCBzZXAgPSAiIikKYWxsX2ZpbGVzID0gbGlzdC5maWxlcyhwYXRoID0gZGF0YXNldF9kaXIsIGZ1bGwubmFtZXMgPSBUUlVFLCByZWN1cnNpdmUgPSBUUlVFKQoKZm9yKGRhdGFzZXRfbmFtZSBpbiBhbGxfZmlsZXMpewogICAgZGYgPSByZWFkLmNzdihkYXRhc2V0X25hbWUsIGNoZWNrLm5hbWVzID0gRkFMU0UsIGhlYWRlciA9IGhlYWRlciwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQogICAgcGxvdCh4ID0gZGYkeCwgeSA9IGRmJHksIHR5cGUgPSAibCIsIG1haW4gPSBkYXRhc2V0X25hbWUpCn0KCmRhdGFzZXRfZGlyID0gcGFzdGUoYmFzZV9wYXRoLCAiZmFrZV9yZWFkeS8iLCBzZXAgPSAiIikKYWxsX2ZpbGVzID0gbGlzdC5maWxlcyhwYXRoID0gZGF0YXNldF9kaXIsIGZ1bGwubmFtZXMgPSBUUlVFLCByZWN1cnNpdmUgPSBUUlVFKQoKZm9yKGRhdGFzZXRfbmFtZSBpbiBhbGxfZmlsZXMpewogICAgZGYgPSByZWFkLmNzdihkYXRhc2V0X25hbWUsIGNoZWNrLm5hbWVzID0gRkFMU0UsIGhlYWRlciA9IGhlYWRlciwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQogICAgcGxvdCh4ID0gZGYkeCwgeSA9IGRmJHksIHR5cGUgPSAibCIsIG1haW4gPSBkYXRhc2V0X25hbWUpCn0KCmBgYAoK